package org.myapp.service;

import org.myapp.service.login.ILoginService;
import org.myapp.service.login.LoginServiceImpl;

import com.google.inject.AbstractModule;
import com.google.inject.Guice;
import com.google.inject.Injector;

/**
 * サービス管理、Injectorのシングルトンクラス.<br>
 *
 * @author SASAKI
 *
 */
public class ServiceLocator {

	private ServiceLocator() {
		// private constructor
	}

	/** シングルトン  */
	private static ServiceLocator locator = null;

	/** インジェクター */
	private Injector serviceInjector = null;

	/**
	 * インスタンス取得.<br>
	 *
	 * @return ServiceManager
	 */
	public final static ServiceLocator instance() {

	    if (locator == null) {
	        locator = new ServiceLocator();
	        locator.init();
	    }

		return locator;
	}

	/**
	 * インジェクターの初期化.<br>
	 */
	public final void init() {

		if (serviceInjector == null) {
			serviceInjector = Guice.createInjector(
					new AbstractModule() {

						@Override
						protected void configure() {
							bind(ILoginService.class).to(LoginServiceImpl.class);
						}
					});
		}
	}

	/**
	 * サービス群を取得.<br>
	 * @return ServiceClass
	 */
	public final <T> T getService(Class<T> serviceClass) {
		return serviceInjector.getInstance(serviceClass);
	}
}
